import cce_toolkit from '@/utils/cce_toolkit'

// ---------------你可以在此新增适应实际项目需求的策略---------------
const strategies = {
	// 是否手机号
	isMobile(str) {
		return cce_toolkit.verify_phone(str)
	},
	// 是否必填
	isRequired(str) {
		// 除去首尾空格
		const value = str.replace(/(^\s*)|(\s*$)/g, "");
		return value !== "";
	},
	// 最小长度
	minLength(str, length) {
		const strLength = str.length;
		return strLength >= length;
	},
	// 是否相等
	isEqual() {
		// 可以接收多个参数比较
		const args = Array.prototype.slice.call(arguments);
		// 取首项与后面所有的项比较，如果每个都相等，就返回true
		const equal = args.every(function(value) {
			return value === args[0];
		})
		return equal;
	},
	// 2到10个汉字
	isName(params) {
		return /^[\u4E00-\u9FA5]{2,10}$/.test(params);
	},
	//  2到20个汉字或者英文或者空格
	isBabyName(params) {
		return /^([\u4E00-\u9FA5]|[a-zA-Z]|\s){2,20}$/.test(params);
	},
	//判断6位数
	checkCode(num) {
		return /^(?!000000)([0-9]){6}$/.test(num) ? true : false;
	},
	// 6到40个字且包含汉字 && 没有包含特殊字符
	isAddress(params) {
		const one = /[\u4e00-\u9fa5]/.test(params) && /^.{6,40}$/.test(params);
		const two = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/.test(params);
		return one && two;
	},
}

// 策略对象
class Validate {
	constructor() {
		this.rules = strategies
	}
	verify(rules) {
		let v = this,
			valid;
		for (let key in rules) {
			for (let i = 0; i < rules[key].length; i++) {
				let ruleName = rules[key][i].rule;
				let value = rules[key][i].value;
				if (!Array.isArray(value)) {
					value = new Array(value)
				}
				let result = v.rules[ruleName].apply(this, value);
				if (!result) {
					valid = {
						errKey: key,
						errMsg: rules[key][i].message
					}
					break;
				}
			}
			if (valid) break;
		}
		return valid
	}
}

export default new Validate()
